/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cheetah.sisal;

import com.itextpdf.text.pdf.PdfReader;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.IOUtils;
import org.cheetah.sisal.beans.Avvenimento;
import org.cheetah.sisal.beans.Palinsesto;

/**
 *
 * @author edoardo
 */
public class GetScores {

    private static List<String> startTableText = new ArrayList<String>();

    static {
        startTableText.add("CALCIO");
        startTableText.add("BASKET");
        startTableText.add("TENNIS");
        startTableText.add("VOLLEY");
        startTableText.add("FOOTBA");
        startTableText.add("RUGBY");
        startTableText.add("HOCKEY");
        startTableText.add("MOTO");
        startTableText.add("PMANO");
        startTableText.add("BASEBA");

    }

    public static void main(String[] args) throws Exception {
        Calendar calendar = Calendar.getInstance();
        String gg = Integer.toString(calendar.get(Calendar.DAY_OF_MONTH) - 1);
        String mm = Integer.toString(calendar.get(Calendar.MONTH) + 1);
        String aa = Integer.toString(calendar.get(Calendar.YEAR)).substring(2);
        String data = new StringBuilder(aa).append("_").append(mm).append("_").append(gg).toString();
        if (args != null && args.length == 1) {
            data = args[0];
        }
        System.out.println(getRisultati(data, true));
    }

//    public static Map<String, Palinsesto> getRisultati(String data) throws Exception {
//        return getRisultati(data, false);
//    }
    public static Map<String, Palinsesto> getRisultati(String data, boolean keepTemp) throws Exception {
        Map<String, Palinsesto> palinsesti = new HashMap<String, Palinsesto>();
        System.out.println(data);
        try {
            String destDir = System.getProperty("user.home") + File.separator +"TEMP_RISULTATI";
            File fDestDir = new File(destDir);
            if(!fDestDir.exists()){
                fDestDir.mkdir();
            }
            String fileTxt = destDir+File.separator+ data + ".txt";
            List<String> pages = new ArrayList<String>();
            if (!keepTemp || !new File(fileTxt).exists()) {
                URL url = new URL("http://statistiche.pianetascommesse.it/download/pdf/risultati/" + data + "_RIS.pdf");
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                InputStream pdfIn = con.getInputStream();
                PdfReader reader = new PdfReader(pdfIn);
                int n = reader.getNumberOfPages();
                OutputStream out = keepTemp ? new FileOutputStream(fileTxt) : null;

                for (int i = 0; i < n; i++) {
                    StringBuffer sbLine = new StringBuffer();
//            sbLine.append("Page: " + (i + 1)).append("\n\n");
                    byte[] b = reader.getPageContent(i + 1);
                    BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(b)));
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        if (line.indexOf("Tj") != -1) {
                            line = line.substring(line.indexOf("(") + 1, line.indexOf(")"));

                            sbLine.append(new String(line.getBytes(), "UTF-8")).append("\n");
                        }

                    }
                    pages.add(sbLine.toString());
                    if (out != null) {
                        out.write(sbLine.toString().getBytes("UTF-8"));
                    }
                }

                pdfIn.close();
                if (out != null) {
                    out.flush();
                    out.close();
                }
            }
            if(keepTemp && pages.size()==0){
                pages.add(IOUtils.toString(new FileInputStream(fileTxt)));
            }
//        System.out.println(sbLine);
            for (String sbLine : pages) {

                //secondo ciclo che estrae i dati e li raggruppa in per palinsesto
                BufferedReader br = new BufferedReader(new StringReader(sbLine));

                String line = "";

                while (line != null) {
                    String lineBefore = line;
                    line = br.readLine();
                    if (lineBefore.equalsIgnoreCase("calcio") && line.toLowerCase().indexOf("pal.") != -1) {
                        String num = line.substring(line.toLowerCase().indexOf("pal.") + "pal.".length()).trim();
                        Palinsesto palinsesto = palinsesti.get(num);
                        if (palinsesto == null) {
                            palinsesto = new Palinsesto();
                        }
                        palinsesto.setNumero(num);
                        line = br.readLine();//passo al rigo successivo
                        String competizione = line;
                        while (line != null && !line.toLowerCase().equals("risultato")) {
                            line = br.readLine();
                        }
                        //dopo la colonna "RISULTATO" ci sono i veri e propri risultati
//                while (!(line = br.readLine()).equals("CALCIO")) {
                        while (!startTableText.contains((line = br.readLine()))) {

                            Avvenimento avvenimento = new Avvenimento();
                            avvenimento.setNomeCompetizione(competizione);
                            avvenimento.setNumero(line);
                            avvenimento.setDescrizione(br.readLine());
                            String risPrimoTempo = br.readLine();
                            String risSecondoTempo = "";
                            if (risPrimoTempo == null) {
                                break;
                            }
                            if (risPrimoTempo.indexOf("/") != -1) {
                                risSecondoTempo = risPrimoTempo.substring(risPrimoTempo.indexOf("/") + 1);

                                risPrimoTempo = risPrimoTempo.substring(0, risPrimoTempo.indexOf("/"));

                                if (risSecondoTempo.toLowerCase().indexOf("dts") != -1 || risSecondoTempo.toLowerCase().indexOf("d.t.s.") != -1 || risSecondoTempo.toLowerCase().indexOf("d.t.s") != -1) {
                                    //il risultato del secondo tempo è uguale a quello del primo
                                    if (risSecondoTempo.startsWith("\\(")) {
                                        risSecondoTempo = risPrimoTempo;
                                    }
                                    if (risSecondoTempo.toLowerCase().indexOf("\\(") > 0) {
                                        risSecondoTempo = risSecondoTempo.substring(0, risSecondoTempo.indexOf("\\(")).trim();
                                    }
                                }

                                if (risSecondoTempo.toLowerCase().indexOf("dcr") != -1 || risSecondoTempo.toLowerCase().indexOf("d.c.r.") != -1 || risSecondoTempo.toLowerCase().indexOf("d.c.r") != -1) {
                                    //il risultato del secondo tempo è uguale a quello del primo
                                    if (risSecondoTempo.startsWith("\\(")) {
                                        risSecondoTempo = risPrimoTempo;
                                    }
                                    if (risSecondoTempo.indexOf("\\(") > 0) {
                                        risSecondoTempo = risSecondoTempo.substring(0, risSecondoTempo.indexOf("\\(")).trim();
                                    }
                                }
                                if (risSecondoTempo.toLowerCase().indexOf("dr") != -1) {
                                    //il risultato del secondo tempo è uguale a quello del primo
                                    if (risSecondoTempo.startsWith("\\(") || risSecondoTempo.endsWith("dr") || risSecondoTempo.endsWith("d.r.") || risSecondoTempo.endsWith("d.r")) {
                                        risSecondoTempo = risPrimoTempo;
                                    }
                                    if (risSecondoTempo.indexOf("\\(") > 0) {
                                        risSecondoTempo = risSecondoTempo.substring(0, risSecondoTempo.indexOf("\\(")).trim();
                                    }
                                }
                                if (risSecondoTempo.toLowerCase().indexOf("/") != -1) {
                                    risSecondoTempo = risSecondoTempo.substring(0, risSecondoTempo.indexOf("/"));
                                }
                            }
                            avvenimento.setRisultatoPrimoTempo(risPrimoTempo);
                            avvenimento.setRisultatoSecondoTempo(risSecondoTempo);
                            if (risSecondoTempo.indexOf("-") != -1) {
                                palinsesto.addAvvenimento(avvenimento);
                            }
//                        System.out.println(avvenimento);
                        }

                        palinsesti.put(num, palinsesto);
                    }

//                    System.out.println(line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("No scores in " + data);
        }
        return palinsesti;
    }
}
